package doit20.sparksql

import org.apache.spark.sql.types.{DataTypes, StructField, StructType}
import org.apache.spark.sql.{DataFrame, SparkSession}

/**
 * @author 涛哥
 * @nick_name "deep as the sea"
 * @contact qq:657270652 wx:doit_edu
 * @site www.doitedu.cn
 * @date 2021-04-09
 * @desc sparksql入门示例1
 *      求性别中的最大年龄
 */
object Demo1 {
  def main(args: Array[String]): Unit = {

    val spark = SparkSession.builder()
      .appName("demo1")
      .master("local[*]")
      .getOrCreate()


    // 读数据
    // 本df，即有数据，又有表结构schema
    val df1: DataFrame = spark.read.csv("data/stu.txt")

    // 打印表结构
    df1.printSchema()
    /**
     * root
     * |-- _c0: string (nullable = true)
     * |-- _c1: string (nullable = true)
     * |-- _c2: string (nullable = true)
     * |-- _c3: string (nullable = true)
     * |-- _c4: string (nullable = true)
     */

    // 上面自动生成的表结构，往往不符合我们的需求
    // 我们可以自己指定表结构
    val schema: StructType = StructType(Seq(
      StructField("id", DataTypes.StringType),
      StructField("name", DataTypes.StringType),
      StructField("age", DataTypes.IntegerType),
      StructField("score", DataTypes.FloatType),
      StructField("gender", DataTypes.StringType)
    ))

    // df2也一样看做一张表，但是表的schema是我们自己指定的
    val df2: DataFrame = spark.read.schema(schema).csv("data/stu.txt")
    df2.printSchema()


    // 将df2注册一个表名
    df2.createTempView("stu")

    // 就可以写sql来计算了
    val df3: DataFrame = spark.sql(
      """
        |
        |select
        |  gender,
        |  max(age)
        |from stu
        |group by gender
        |
        |""".stripMargin)

    df3.printSchema()
    df3.show(100,false)





    spark.close()
  }
}
